package sid

import (
	"sync"

	"github.com/bwmarrin/snowflake"
	"github.com/sony/sonyflake"
)

var (
	sid  *Sid
	once sync.Once
)

// Sid sid
type Sid struct {
	sf   *sonyflake.Sonyflake
	node *snowflake.Node
}

// NewSid 初始化一个 sid
//
//	@return *Sid
func NewSid() *Sid {
	once.Do(func() {
		sf := sonyflake.NewSonyflake(sonyflake.Settings{})
		if sf == nil {
			panic("sonyflake not created")
		}

		node, err := snowflake.NewNode(0xF)
		if err != nil {
			panic("sonyflake node not created")
		}

		sid = &Sid{sf, node}
	})

	return sid
}

// GenString 生成 字符串 类型的id
//
//	@return string
//	@return error
func (s Sid) GenString() (string, error) {
	id := s.node.Generate()
	return id.String(), nil

	// id, err := s.sf.NextID()
	// if err != nil {
	// 	return "", err
	// }

	// return strconv.Itoa(int(id)), nil
}

// GenBase62String 生成一个 base62 的 id
//
//	@receiver s
//	@return string
//	@return error
func (s Sid) GenBase62String() (string, error) {
	id := s.node.Generate()
	return id.Base64(), nil
	// id, err := s.sf.NextID()
	// if err != nil {
	// 	return "", err
	// }

	// return convert.IntToBase62(int(id)), nil
}

// GenUint64 生成 uint64 类型的id
//
//	@return uint64
//	@return error
func (s Sid) GenUint64() (uint64, error) {
	id := s.node.Generate()
	return uint64(id.Int64()), nil
	// return s.sf.NextID()
}

// GenID 生产一个 ID
//
//	@receiver s
//	@return snowflake.ID
func (s Sid) GenID() snowflake.ID {
	return s.node.Generate()
}

// GenID
//
//	@return snowflake.ID
func GenID() snowflake.ID {
	return NewSid().GenID()
}

// GenString 生成 字符串 类型的id
//
//	@return string
//	@return error
func GenString() (string, error) {
	return NewSid().GenString()
}

// GenBase62String 生成一个 base62 的 id
//
//	@return uint64
//	@return error
func GenBase62String() (string, error) {
	return NewSid().GenBase62String()
}

// GenUint64 生成 uint64 类型的id
//
//	@return uint64
//	@return error
func GenUint64() (uint64, error) {
	return NewSid().GenUint64()
}
